{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Textclass-att
0Braća Koen (Coen brothers) iako poznati po tri...POSITIVE
1Često upadam u veliku raspravu kada se izjasni...POSITIVE
2“Ulični Psi” je jedan od onih filmova koji sve...POSITIVE
3Užasno potcenjen film! Predvođen dvojicom najp...POSITIVE
4Naprosto sam oduševljen ovim projektom, ovo je...POSITIVE
\n", "
" ], "text/plain": [ " Text class-att\n", "0 Braća Koen (Coen brothers) iako poznati po tri... POSITIVE\n", "1 Često upadam u veliku raspravu kada se izjasni... POSITIVE\n", "2 “Ulični Psi” je jedan od onih filmova koji sve... POSITIVE\n", "3 Užasno potcenjen film! Predvođen dvojicom najp... POSITIVE\n", "4 Naprosto sam oduševljen ovim projektom, ovo je... POSITIVE" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Ucitavanje dataset-a za klasifikaciju sentimenta\n", "import pandas as pd\n", "data = pd.read_csv(\"SerbMR-2C.csv\")\n", "# Prikazuje prvih pet linija skupa podataka\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.8011869436201781\n" ] } ], "source": [ "# Obucavanje multinomijalnog naivnog Bajesovog klasifikatora na svim podacima\n", "corpus = data['Text']\n", "y = data['class-att']\n", "from sklearn.naive_bayes import MultinomialNB\n", "clf = MultinomialNB()\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "vectorizer = CountVectorizer()\n", "X = vectorizer.fit_transform(corpus)\n", "clf.fit(X, y)\n", "\n", "# Obucavanje i evaluacija multinomijalnog naivnog Bajesovog klasifikatora pomocu jednostruke train/test podele\n", "from sklearn.model_selection import train_test_split\n", "corpus_train, corpus_test, y_train, y_test = train_test_split(corpus, y, test_size=0.2, random_state=0)\n", "X_train = vectorizer.fit_transform(corpus_train)\n", "clf.fit(X_train, y_train)\n", "\n", "X_test = vectorizer.transform(corpus_test)\n", "y_pred = clf.predict(X_test)\n", "print(\"Accuracy: \", ((y_test == y_pred).sum() / X_test.shape[0]))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.88757396 0.81065089 0.82738095 0.67261905 0.7202381 0.72619048\n", " 0.69047619 0.63690476 0.8452381 0.75 ]\n", "Accuracy: 0.7567272471118625\n" ] } ], "source": [ "# Obucavanje i evaluacija multinomijalnog naivnog Bajesovog klasifikatora pomocu desetoslojne unakrsne validacije\n", "from sklearn.model_selection import cross_val_score\n", "from sklearn.pipeline import Pipeline\n", "p_clf = Pipeline([('vectorizer', CountVectorizer()), ('classifier', MultinomialNB())])\n", "acc = cross_val_score(p_clf, corpus, y, cv=10)\n", "print(acc)\n", "print(\"Accuracy: \", acc.mean())" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.8816568 0.85207101 0.71428571 0.74404762 0.69642857 0.79166667\n", " 0.68452381 0.69642857 0.72619048 0.78571429]\n", "Accuracy: 0.7573013524936602\n", "[0.88132022 0.85188431 0.70930065 0.74360248 0.69641782 0.78951137\n", " 0.68424412 0.69615944 0.72556818 0.78568391]\n", "F-measure: 0.7563692505355197\n" ] } ], "source": [ "# Obucavanje i evaluacija logisticke regresije pomocu desetoslojne unakrsne validacije, bez optimizacije hiperparametara\n", "from sklearn.linear_model import LogisticRegression\n", "clf = LogisticRegression(solver='liblinear') # liblinear koristi OVR strategiju\n", "p_clf = Pipeline([('vectorizer', CountVectorizer()), ('classifier', clf)])\n", "acc = cross_val_score(p_clf, corpus, y, cv=10, scoring='accuracy')\n", "print(acc)\n", "print(\"Accuracy: \", acc.mean())\n", "f1 = cross_val_score(p_clf, corpus, y, cv=10, scoring='f1_macro')\n", "print(f1)\n", "print(\"F-measure: \", f1.mean())" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.92307692 0.88757396 0.77380952 0.73214286 0.70833333 0.79761905\n", " 0.74404762 0.66666667 0.8452381 0.80952381]\n", "Accuracy: 0.7888031839954917\n" ] } ], "source": [ "# Obucavanje i evaluacija logisticke regresije pomocu desetoslojne unakrsne validacije, bez optimizacije hiperparametara\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "clf = LogisticRegression(solver='liblinear') # liblinear koristi OVR strategiju\n", "p_clf = Pipeline([('vectorizer', TfidfVectorizer(sublinear_tf=True, use_idf=True)), ('classifier', clf)])\n", "acc = cross_val_score(p_clf, corpus, y, cv=10, scoring='accuracy')\n", "print(acc)\n", "print(\"Accuracy: \", acc.mean())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.84866469 0.7388724 0.76785714 0.68154762 0.75595238]\n", "Optimized Accuracy: 0.7585788469690546\n", "[0.77151335 0.77151335 0.77380952 0.72916667 0.76785714]\n", "Optimized Accuracy: 0.7627720079129574\n" ] } ], "source": [ "# Obucavanje i evaluacija logisticke regresije pomocu desetoslojne unakrsne validacije, sa optimizacijom hiperparametara\n", "from sklearn.model_selection import GridSearchCV, StratifiedKFold\n", "clf = LogisticRegression(solver='liblinear')\n", "p_grid_lr = {'classifier__C': [0.1, 1.0, 10]}\n", "p_clf = Pipeline([('vectorizer', CountVectorizer()), ('classifier', clf)])\n", "gs_clf = GridSearchCV(estimator=p_clf, param_grid=p_grid_lr, cv=2, scoring='accuracy')\n", "acc = cross_val_score(gs_clf, corpus, y, cv=5, scoring='accuracy')\n", "print(acc)\n", "print(\"Optimized Accuracy: \", acc.mean())\n", "\n", "# Bolja opcija - rucno zadati stratifikovanu CV podelu tako da podaci budu promesani\n", "gs_clf = GridSearchCV(estimator=p_clf, param_grid=p_grid_lr, cv=StratifiedKFold(shuffle=True, n_splits=2), scoring='accuracy')\n", "acc = cross_val_score(gs_clf, corpus, y, cv=StratifiedKFold(shuffle=True, n_splits=5), scoring='accuracy')\n", "print(acc)\n", "print(\"Optimized Accuracy: \", acc.mean())" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.82492582 0.72997033 0.77678571 0.69345238 0.75 ]\n", "Accuracy: 0.755026847534266\n", "[0.82492582 0.73293769 0.77678571 0.69345238 0.75 ]\n", "Optimized Accuracy: 0.7556203193443549\n" ] } ], "source": [ "# Obucavanje i evaluacija SVM pomocu desetoslojne unakrsne validacije, sa i bez optimizacije hiperparametara\n", "from sklearn.svm import LinearSVC\n", "# SVM bez kernela, L2 regularizacija, L2 funkcija gubitka, resavanje u primalnom domenu\n", "clf = LinearSVC(penalty='l2', loss='squared_hinge', dual=True, max_iter=100000) \n", "p_grid_svm = {'classifier__C': [0.1, 1.0, 10]}\n", "p_clf = Pipeline([('vectorizer', CountVectorizer()), ('classifier', clf)])\n", "gs_clf = GridSearchCV(estimator=p_clf, param_grid=p_grid_svm, cv=2, scoring='accuracy')\n", "acc = cross_val_score(p_clf, corpus, y, cv=5, scoring='accuracy')\n", "print(acc)\n", "print(\"Accuracy: \", acc.mean())\n", "acc = cross_val_score(gs_clf, corpus, y, cv=5, scoring='accuracy')\n", "print(acc)\n", "print(\"Optimized Accuracy: \", acc.mean())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }